<?php

namespace app\api\service;

use think\facade\Db;

//分润
class CommissionService
{ 
    /**
     * 计算产品分润
     * @param oid 订单id
     */
    public function productFr($oid)
    {
        $o_info = Db::name('order')->where('id', $oid)->where('is_fr', 1)->find();
        if (!empty($o_info)) {
            list($productJcBl, $cash_agent_ratio, $cash_shop_ratio,
                $advertising_agent_ratio, $advertising_shop_ratio, $product_agent_ratio, $product_shop_ratio) = $this->getConfig($o_info['store_id']);
            $o_real_money = $o_info['real_amount'];

            $real_dis_money = bcmul($o_real_money, $productJcBl, 2); //平台分润的基数
            $real_real_amount = bcsub($o_real_money, $real_dis_money, 2); //分配完订单的实际金额
            if (($product_agent_ratio + $product_shop_ratio) <= 1) {
                $product_agent_money = bcmul($real_dis_money, $product_agent_ratio, 2); //代理分润金额
                $product_shop_money = bcmul($real_dis_money, $product_shop_ratio, 2); //商户分润金额
                $sy_money = $real_dis_money - $product_agent_money - $product_shop_money; //剩余的分润金额给平台
                Db::startTrans();
                try {
                    Db::name('order')->where('id', $oid)->update(['is_fr' => 2, 'product_bili' => $productJcBl, 'real_real_amount' => $real_real_amount]);
                    list($sid, $pid, $p_type) = $this->getShopAgent($o_info['user_id'], $o_info['store_id']);
                    $this->distributionCommisson($sid, $pid, $p_type, $product_shop_money, $product_agent_money, 1, $oid, $sy_money);
                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                }
            }
        }
    }

    /**
     * 分配佣金
     * @param sid 商户id
     * @param type 1、产品分润 2、广告分润 3、视频分润
     * @param pid 代理id
     * @param p_type 代理类型1、省代 2、市代 3、区代 4、vip代理'
     * @param s_money 商家佣金
     * @param a_money 代理佣金
     * @param sy_money 剩余佣金给平台
     */
    public function distributionCommisson($sid, $pid, $p_type, $s_money, $a_money, $type, $source = 0, $sy_money = 0)
    {
        if ($sid) {
            //给商家
            Db::name('user')->where('user_id', $sid)->inc('shop_balance', $s_money)->update();
            Db::name('commission')->insert(
                ['uid' => $sid, 'type' => $type, 'c_type' => 1, 'money' => $s_money, 'desc' => '产品分润:商家分润', 'source' => $source, 'create_time' => time()]
            );
            Db::name('finance')->insert(
                ['uid' => $sid, 'money' => $s_money, 'f_type' => 2, 'status' => 4, 'desc' => '商家-产品分润', 'source' => $source, 'create_time' => time()]
            );
        } else {
            //没有商家给 平台
            Db::name('commission')->insert(
                ['uid' => 0, 'type' => $type, 'c_type' => 0, 'money' => $s_money, 'desc' => '产品分润:商家不存在', 'source' => $source, 'create_time' => time()]
            );
        }

        if ($pid) {
            //给代理
            Db::name('user')->where('user_id', $pid)->inc('agent_balance', $a_money)->update();
            Db::name('commission')->insert(
                ['uid' => $pid, 'type' => $type, 'c_type' => 2,'p_type'=>$p_type, 'money' => $a_money, 'desc' => '产品分润:代理佣金', 'source' => $source, 'create_time' => time()]
            );
            Db::name('finance')->insert(
                ['uid' => $pid, 'money' => $a_money, 'f_type' => 2, 'status' => 4, 'desc' => '代理-产品分润', 'source' => $source, 'create_time' => time()]
            );
        } else {
            //没有代理给 平台
            Db::name('commission')->insert(
                ['uid' => 0, 'type' => $type, 'c_type' => 0, 'money' => $a_money, 'desc' => '产品分润代理不存在', 'source' => $source, 'create_time' => time()]
            );
        }
        Db::name('commission')->insert(
            ['uid' => 0, 'type' => $type, 'c_type' => 0, 'money' => $sy_money, 'desc' => '产品分润剩余佣金给平台', 'source' => $source, 'create_time' => time()]
        );
    }

    //获取分配配置
    //reutrn $productJcBl 产品分润的基础比例
    //$cash_agent_ratio,  现金分润 代理比例
    //$cash_shop_ratio,   现金分润 商户比例
    //$advertising_agent_ratio, 广告分润 代理比例
    //$advertising_shop_ratio,  广告分润  商户比例
    //$product_agent_ratio,  产品分润  代理比例
    //$product_shop_ratio   产品分润 商户比例
    public function getConfig($store_id)
    {
        //先获取产品分润的基础比例
        $productJcBl = Db::name('config')->where('store_id', $store_id)->where('key', 'product_bili')->value('value');

        //现金分润
        $cash_agent_ratio = Db::name('commission_config')->where('store_id', $store_id)->where('key', 'cash_agent_ratio')->value('value'); //现金分润代理比例
        $cash_shop_ratio = Db::name('commission_config')->where('store_id', $store_id)->where('key', 'cash_shop_ratio')->value('value'); //现金分润商户比例

        //广告分润
        $advertising_agent_ratio = Db::name('commission_config')->where('store_id', $store_id)->where('key', 'advertising_agent_ratio')->value('value'); //广告分润 代理比例
        $advertising_shop_ratio = Db::name('commission_config')->where('store_id', $store_id)->where('key', 'advertising_shop_ratio')->value('value'); //广告分润 商户比例

        //产品分润
        $product_agent_ratio = Db::name('commission_config')->where('store_id', $store_id)->where('key', 'product_agent_ratio')->value('value'); //产品分润 代理比例
        $product_shop_ratio = Db::name('commission_config')->where('store_id', $store_id)->where('key', 'product_shop_ratio')->value('value'); //产品分润 商户比例

        return [$productJcBl, $cash_agent_ratio, $cash_shop_ratio,
            $advertising_agent_ratio, $advertising_shop_ratio, $product_agent_ratio, $product_shop_ratio];
    }

    /**
     * 获取用户被锁的商家和代理
     * return void shop_id店铺id   parent_id 代理id agent_type 代理类型 1、省代 2、市代 3、区代 4、vip代理
     */
    public function getShopAgent($uid, $store_id)
    {
        $shop_id = Db::name('shop_lock_guest')->where('store_id', $store_id)->where('uid', $uid)->where('status', 1)->value('shop_uid');
        if ($shop_id) {
            $is_shop = Db::name('user')->where(['user_id' => $shop_id, 'type' => 2, 'store_id' => $store_id])->value('id');
            if ($is_shop) {
                //获取商家的代理
                $parent_id = Db::name('user_level')->where('user_id', $shop_id)->where('level', 1)->where('store_id', $store_id)->value('parent_user_id');
                $parent_info = Db::name('user')->where(['user_id' => $parent_id, 'store_id' => $store_id])->where('is_agent', '>', 0)->find();
                if (!empty($parent_info)) {
                    $agent_type = $parent_info['is_agent']; //1、省代 2、市代 3、区代 4、vip代理
                    return [$shop_id, $parent_id, $agent_type];
                } else {
                    return [$shop_id, 0, 0];
                }
            }
        }
        return [0, 0, 0];
    }
}
